/**
 * Software License, Version 1.0
 * 
 * Copyright 2003 The Trustees of Indiana University.  All rights reserved.
 * 
 *
 *Redistribution and use in source and binary forms, with or without 
 *modification, are permitted provided that the following conditions are met:
 *
 *1) All redistributions of source code must retain the above copyright notice,
 * the list of authors in the original source code, this list of conditions and
 * the disclaimer listed in this license;
 *2) All redistributions in binary form must reproduce the above copyright 
 * notice, this list of conditions and the disclaimer listed in this license in
 * the documentation and/or other materials provided with the distribution;
 *3) Any documentation included with all redistributions must include the 
 * following acknowledgement:
 *
 *"This product includes software developed by the Community Grids Lab. For 
 * further information contact the Community Grids Lab at 
 * http://communitygrids.iu.edu/."
 *
 * Alternatively, this acknowledgement may appear in the software itself, and 
 * wherever such third-party acknowledgments normally appear.
 * 
 *4) The name Indiana University or Community Grids Lab or NaradaBrokering, 
 * shall not be used to endorse or promote products derived from this software 
 * without prior written permission from Indiana University.  For written 
 * permission, please contact the Advanced Research and Technology Institute 
 * ("ARTI") at 351 West 10th Street, Indianapolis, Indiana 46202.
 *5) Products derived from this software may not be called NaradaBrokering, 
 * nor may Indiana University or Community Grids Lab or NaradaBrokering appear
 * in their name, without prior written permission of ARTI.
 * 
 *
 * Indiana University provides no reassurances that the source code provided 
 * does not infringe the patent or any other intellectual property rights of 
 * any other entity.  Indiana University disclaims any liability to any 
 * recipient for claims brought by any other entity based on infringement of 
 * intellectual property rights or otherwise.  
 *
 *LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH NO 
 *WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA UNIVERSITY GIVES
 *NO WARRANTIES AND MAKES NO REPRESENTATION THAT SOFTWARE IS FREE OF 
 *INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR OTHER PROPRIETARY RIGHTS. 
 *INDIANA UNIVERSITY MAKES NO WARRANTIES THAT SOFTWARE IS FREE FROM "BUGS", 
 *"VIRUSES", "TROJAN HORSES", "TRAP DOORS", "WORMS", OR OTHER HARMFUL CODE.  
 *LICENSEE ASSUMES THE ENTIRE RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR 
 *ASSOCIATED MATERIALS, AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION 
 *GENERATED USING SOFTWARE.
 */
package cgl.narada.service.security.impl;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.Key;
import java.security.KeyStore;
import java.util.Enumeration;

import cgl.narada.service.ServiceException;

public class KeyStoreManagementImpl {
  private String moduleName = "KeyStoreManagementImpl: ";

  public KeyStore 
  createKeyStore(String keyStoreFileLocation, String keyStoreType, 
		 String keyStoreProvider, char[] keyStorePassword) 
    throws ServiceException {
    try {
      File keyStoreFile  = new File(keyStoreFileLocation);      
      KeyStore keyStore = KeyStore.getInstance(keyStoreType, 
					       keyStoreProvider);
      
      if (keyStoreFile.exists()) {
        FileInputStream in = new FileInputStream(keyStoreFile);
        keyStore.load(in, keyStorePassword);
        in.close();
      } else {
        keyStore.load(null, null);
      }
      
      return keyStore;
    } catch (Exception e) {
      throw new ServiceException(moduleName + "Error creating keystore " + e);
    }/* end try-catch */
    
  }
  
  public void 
  saveKeyStore(KeyStore keyStore, String keyStoreFileLocation, 
	       char[] keyStorePassword) 
    throws ServiceException {
    
    try {
      File keyStoreFile = new File(keyStoreFileLocation);
      FileOutputStream out = new FileOutputStream(keyStoreFile);
      keyStore.store(out, keyStorePassword);
      out.close();
      
    } catch (Exception e) {
      throw new ServiceException(moduleName + "Error creating keystore " + e);
    }/* end try-catch */
  }
  
  
  public void addTemplateKey(int templateId, KeyStore templateKeyStore, 
			     Key templateKey, char[] keyEntryPassword) 
    throws ServiceException {
    
    try {
      if (templateKeyStore == null) {
	throw new ServiceException(moduleName + "TemplateKeyStore not " + 
				   "previously initialized" );
      }
      String templateInfo = "" + templateId;
      
      if (templateKeyStore.containsAlias(templateInfo)) {
	throw new ServiceException(moduleName + "Entry for [" + templateInfo +
				   "] already exists. Cannot add templateKey");
      }


      templateKeyStore.setKeyEntry(templateInfo, templateKey, 
				   keyEntryPassword, null);
      
    } catch (Exception e) {
      throw new ServiceException(moduleName + 
				 "Error registering template key " + e);
    }/* end try-catch */
    
  }


  public void removeTemplateKey(int templateId, KeyStore templateKeyStore)
    throws ServiceException {
    
    try {
      if (templateKeyStore == null) {
	throw new ServiceException(moduleName + "TemplateKeyStore not " + 
				   "previously initialized" );
      }
      String templateInfo = "" + templateId;
      


      if (!templateKeyStore.containsAlias(templateInfo)) {
	throw new ServiceException(moduleName + "Entry for [" + templateInfo +
				   "] does not exist. Cannot remove key ");
      }
      templateKeyStore.deleteEntry(templateInfo);
      
    } catch (Exception e) {
      throw new ServiceException(moduleName + 
				 "Error removing template key " + e);
    }/* end try-catch */
    
  }
  
  
  

  public Enumeration retrieveAliases(KeyStore keyStore)
    throws ServiceException {
    try {
      return keyStore.aliases();
    } catch (Exception e) {
      throw new ServiceException(moduleName + "Error retrieving Aliases" + e); 
    }
  }

  
  
  public Key 
  retrieveKey(KeyStore keyStore, String alias, char[] keyEntryPassword) 
    throws ServiceException {
    try {
      if (!keyStore.containsAlias(alias)) {
	throw 
	  new ServiceException(moduleName + "KeyStore [" + keyStore + "] does"
			       + " not contain key corresponding to alias [" +
			       alias); 
      }
      
      if (!keyStore.isKeyEntry(alias)) {
	throw 
	  new ServiceException(moduleName + "alias [" + alias + "does not " + 
			       "correspond to a key entry in KeyStore [" + 
			       keyStore ); 
      }
      
      return keyStore.getKey(alias, keyEntryPassword);
      
    } catch (Exception e) {
      throw new ServiceException(moduleName + "Error retrieving key" + e); 
    }
  }
  


  public void processPersonalKeyStore(KeyStore personalKeyStore, String alias,
				      char[] keyStorePassword) 
    throws ServiceException {
    
    try {
      Key key = personalKeyStore.getKey(alias, keyStorePassword);
      System.out.println(moduleName + "The private key is " + key);
      
      java.security.cert.Certificate certificate = 
	personalKeyStore.getCertificate(alias);
      System.out.println(moduleName + "The public key is" + 
			 certificate.getPublicKey());
      
    } catch(Exception e) {
      System.out.println(moduleName + "Error processing personal key store " +
			 e);
    }

  }


}

